package Algorithm.interview;

/**
 * @Author self
 * @Date 2024/10/17 20:44
 * @Describe 三个线程顺序打印abc
 *
 * 该Java函数通过创建一个固定大小为3的线程池来并发执行三个任务，并使用一个锁对象和计数器来确保任务按顺序执行：
 * 线程池创建：使用Executors.newFixedThreadPool(3)创建一个包含3个线程的线程池。
 * 锁对象与计数器：定义一个锁对象lock用于同步控制，以及一个数组counter用于跟踪任务执行进度。
 * 任务提交：
 * 任务1：打印字符a，增加计数器。
 * 任务2：等待任务1完成（即计数器不为0），然后打印字符b，再次增加计数器。
 * 任务3：等待任务1和任务2完成（即计数器大于等于2），然后打印字符c。
 * 关闭线程池：调用executor.shutdown()方法关闭线程池，不再接受新的任务提交。
 */
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class PrintABCWithThreadPool {
    public static void main(String[] args) {
        // 创建一个固定大小为3的线程池
        ExecutorService executor = Executors.newFixedThreadPool(3);
        // 创建一个锁对象，用于同步控制
        Object lock = new Object();
        // 初始化计数器，用于跟踪任务执行进度
        int[] counter = {0};

        // 提交第一个任务，它将打印字符'a'并增加计数器
        executor.submit(() -> {
            synchronized (lock) {
                System.out.print("a");
                counter[0]++;
                lock.notifyAll();
            }
        });

        // 提交第二个任务，它将等待第一个任务完成，然后打印字符'b'并再次增加计数器
        executor.submit(() -> {
            synchronized (lock) {
                while (counter[0] == 0) {
                    try {
                        lock.wait();
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                    }
                }
                System.out.print("b");
                counter[0]++;
                lock.notifyAll();
            }
        });

        // 提交第三个任务，它将等待前两个任务完成，然后打印字符'c'
        executor.submit(() -> {
            synchronized (lock) {
                while (counter[0] < 2) {
                    try {
                        lock.wait();
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                    }
                }
                System.out.print("c");
            }
        });

        // 关闭线程池，不再接受新的任务提交
        executor.shutdown();
    }

}

